﻿#ifndef DYNOBJ_H
#define DYNOBJ_H
#include <string>
#include <map>
// 动态创建实现，可以任意创建任意一个派生类的类对象

// 定义函数指针
typedef void *(*Constructor)();

class CObjectFactory
{
public:

    /**
     * @brief registerClass 注册类
     * @param className 类名称
     * @param constructor 函数指针，构建起
     */
    static void registerClass(std::string className, Constructor constructor){
        constructors()[className] = constructor;// 为map赋值，初始化map对象
    }
    /**
     * @brief createObject 创建对象
     * @param className 类名称
     * @return void*指针
     */
    static void *createObject(const std::string& className){
        Constructor constructor = nullptr;
        if(constructors().find(className) != constructors().end()){
            constructor = (Constructor)constructors().find(className)->second();
        }
        // 若未被赋值，返回nullptr
        if(constructor == nullptr) return nullptr;

        return (*constructor);
    }
private:
    // string->key:动态创建的类名， value是构建
    /**
     * @brief constructors 返回一个map对象
     * @return
     */
    inline static std::map<std::string, Constructor>& constructors(){
        // 返回一个map对象
        static std::map<std::string, Constructor> instance;
        return instance;
    }
};

#define REG_CLASS(class_name)\
class class_name##Helper\
{\
public:\
    class_name##Helper() {\
        CObjectFactory::registerClass(#class_name, class_name##Helper::createObjectFunc);\
    }\
    static void* createObjectFunc(){\
        return new ImplTwo;\
    }\
};\
class_name##Helper class_name##helper;


#endif // DYNOBJ_H
